package com.ovo.network.utils;

import com.google.gson.Gson;
import com.google.gson.TypeAdapter;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.ResponseBody;
import retrofit2.Converter;

public class CustomGsonResponseBodyConverter<T> implements Converter<ResponseBody, Object> {
    private final Gson gson;
    private final TypeAdapter<T> adapter;

    CustomGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }

    @Override
    public T convert(ResponseBody value) throws IOException {
        try {
            JSONObject jsonObject = new JSONObject(value.string());
            if (jsonObject.has("code") && "-1".equals(jsonObject.getString("code"))) {
                // 特定 API 的错误，在相应的 DefaultObserver 的 onError 的方法中进行处理
                throw new ServerResponseException(jsonObject.getString("message"));
            }else if (jsonObject.has("isValidCodeLogin") && "false".equals(jsonObject.getString("isValidCodeLogin"))){
                // 特定 API 的错误，在相应的 DefaultObserver 的 onError 的方法中进行处理
                throw new ServerResponseException("403");
            }else if (jsonObject.has("result")) {
                if (jsonObject.getString("result").equals("true")) {
                    if (jsonObject.has("data")) {
                        try {
                            JSONArray jsonArray = jsonObject.getJSONArray("data");
                            return (T) adapter.fromJson(jsonObject.toString());
                        } catch (Exception e) {
//                            e.printStackTrace();
                            if (jsonObject.has("sessionid")) {
                                jsonObject.getJSONObject("data").put("sessionid", jsonObject.getString("sessionid"));
                            }
                            if (jsonObject.has("fpValidCode")) {
                                jsonObject.getJSONObject("data").put("fpValidCode", jsonObject.getString("fpValidCode"));
                            }
                            if (jsonObject.has("regValidCode")) {
                                jsonObject.getJSONObject("data").put("regValidCode", jsonObject.getString("regValidCode"));
                            }
                            try {
                                return (T) adapter.fromJson(jsonObject.getString("data"));
                            }catch (Exception ee){
//                                ee.printStackTrace();
                                return adapter.fromJson(jsonObject.toString());
                            }
//                            return (T) adapter.fromJson(jsonObject.getString("data"));
                        }
                    } else {
                        String result = jsonObject.toString();
                        return (T) result;
                    }
                } else if (jsonObject.getString("result").equals("false")
                        && jsonObject.has("message")) {
                    // 特定 API 的错误，在相应的 DefaultObserver 的 onError 的方法中进行处理
                    throw new ServerResponseException(jsonObject.getString("message"));
                }
            } else if (jsonObject.has("openid")){//微信登陆
                return adapter.fromJson(jsonObject.toString());
            } else {
                // 特定 API 的错误，在相应的 DefaultObserver 的 onError 的方法中进行处理
                throw new ServerResponseException(jsonObject.toString());
            }
        } catch (JSONException e) {
            e.printStackTrace();
            if ("application/msword".equals(value.contentType().toString())){
                return (T) value;
            }
        } finally {
            value.close();
        }
        return null;
    }

}
